在使用HashMap的迭代器时,如果调用map.remove()会导致fast-fail,抛出ConcurrentModifyException异常

因为在迭代的过程中,迭代器记录了当前modcount值,而remove和put等方法又会更新该值,当迭代器检测到改值在迭代时被改变了则抛出异常

为什么不允许这么做,要抛出异常?

通过阅读JDK源代码,找出了部分原因:

在返回的迭代器中,记录了next, index 等属性:
```
  Entry<K,V> next;        // next entry to return
  int expectedModCount;   // For fast-fail
  int index;              // current slot
  Entry<K,V> current;     // current entry,用于移除元素
```
每次调用hasNext执行:
```
  public final boolean hasNext() {
     return next != null;
  }
```  
而next又是调用:
final Entry<K,V> nextEntry() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
            Entry<K,V> e = next;
            if (e == null)
                throw new NoSuchElementException();
            
            if ((next = e.next) == null) {
                Entry[] t = table;
                while (index < t.length && (next = t[index++]) == null)
                    ;
            }
            current = e;
            return e;
}


移除元素:当hasNext判断为真,执行nextEntry,也执行通过了验证验证(这里真是如同effective java 所描述那样,先验证条件避免迭代器
在错误的状态),hashmap并不是为并发修改而设计的,并发移除将可能导致链表断裂

添加元素:在nextEntry方法中table可能会resize,导致某些元素被重复迭代
